package cn.yitun.chat.yitunservercommonlib.util;

import cn.yitun.chat.yituncommonutil.YitunCollectionUtil;
import cn.yitun.chat.yitunservercommonlib.dataentity.dto.common.Tree;

import java.util.*;

public class BuildTree {

	public static <T> Tree<T> build(List<Tree<T>> nodes) {

		if (nodes == null) {
			return null;
		}
		List<Tree<T>> topNodes = new ArrayList<>();

		for (Tree<T> children : nodes) {

			String pid = children.getParentId();
			if (pid == null || "0".equals(pid)) {
				topNodes.add(children);

				continue;
			}

			for (Tree<T> parent : nodes) {
				String id = parent.getId();
				if (id != null && id.equals(pid)) {
					parent.getChildren().add(children);
					children.setHasParent(true);
					parent.setHasChildren(true);
					continue;
				}
			}

		}

		Tree<T> root = new Tree<T>();
		if (topNodes.size() == 1) {
			root = topNodes.get(0);
		} else {
			root.setId("-1");
			root.setParentId("");
			root.setHasParent(false);
			root.setHasChildren(true);
			root.setChecked(true);
			root.setChildren(topNodes);
			root.setText("顶级节点");
			Map<String, Object> state = new HashMap<>(16);
			state.put("opened", true);
//			root.setState(state);
		}

		return root;
	}

//	public static <T> TreeVo<T> buildVo(List<TreeVo<T>> nodes) {
//
//		if (nodes == null) {
//			return null;
//		}
//		List<TreeVo<T>> topNodes = new ArrayList<TreeVo<T>>();
//
//		for (TreeVo<T> children : nodes) {
//
//			String pid = children.getParentId();
//			if (pid == null || "0".equals(pid)) {
//				topNodes.add(children);
//
//				continue;
//			}
//
//			for (TreeVo<T> parent : nodes) {
//				String id = parent.getId();
//				if (id != null && id.equals(pid)) {
//					parent.getData().add(children);
//					children.setHasParent(true);
//					parent.setHasChildren(true);
//					continue;
//				}
//			}
//
//		}
//
//		TreeVo<T> root = new TreeVo<T>();
//		if (topNodes.size() == 1) {
//			root = topNodes.get(0);
//		} else {
//			root.setValue("-1");
//			root.setParentId("");
//			root.setHasParent(false);
//			root.setHasChildren(true);
//			root.setChecked(true);
//			root.setData(topNodes);
//			root.setTitle("顶级节点");
//			Map<String, Object> state = new HashMap<>(16);
//			state.put("opened", true);
//			root.setState(state);
//		}
//
//		return root;
//	}

	public static <T> Tree<T> buildList(List<Tree<T>> nodes, String idParam) {
		if (nodes == null) {
			return null;
		}
		List<Tree<T>> topNodes = new ArrayList<>();

		for (Tree<T> children : nodes) {

			String pid = children.getParentId();
			if (pid == null || idParam.equals(pid)) {
				topNodes.add(children);

				continue;
			}

			for (Tree<T> parent : nodes) {
				String id = parent.getId();
				if (id != null && id.equals(pid)) {
					parent.getChildren().add(children);
					children.setHasParent(true);
					parent.setHasChildren(true);

					continue;
				}
			}

		}
		Tree<T> root = new Tree<>();
		if (topNodes.size() == 1) {
			root = topNodes.get(0);
		} else {
			root.setId("-1");
			root.setParentId("");
			root.setHasParent(false);
			root.setHasChildren(true);
			root.setChecked(true);
			root.setChildren(topNodes);
			root.setText("顶级节点");
			Map<String, Object> state = new HashMap<>(16);
			state.put("opened", true);
//			root.setState(state);
		}

		return root;
	}

	public static <T> List<Tree<T>> buildList(List<Tree<T>> nodes, Set<Long> parentIds ) {
		if (nodes == null || YitunCollectionUtil.isEmpty(parentIds)) {
			return null;
		}
		List<Tree<T>> topNodes = new ArrayList<>();

		for (Tree<T> children : nodes) {
			String pid = children.getParentId();
			for (Long topId : parentIds){
				if (pid == null || topId.toString().equals(pid)) {
					topNodes.add(children);

					continue;
				}
			}


			for (Tree<T> parent : nodes) {
				String id = parent.getId();
				if (id != null && id.equals(pid)) {
					parent.getChildren().add(children);
					children.setHasParent(true);
					parent.setHasChildren(true);

					continue;
				}
			}

		}
		return topNodes;
	}

}